package me.lzl.myblog.servlet.admin;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import me.lzl.myblog.dao.ArticleDAO;
import me.lzl.myblog.domain.Article;
import me.lzl.myblog.utils.EncryptUtils;

@WebServlet("/admin/articleAdd.do")
public class ArticleAddServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// 得到上传文件的保存目录，将上传的文件放在webRoot目录下（但是一般为了安全放在WEB-INF目录下，不允许外界直接访问，保证上传的安全）
		String path = this.getServletContext().getRealPath("/uploads/cover");

		File file = new File(path);

		// 判断上传文件的保存目录是否存在
		if (!file.exists() && !file.isDirectory()) {
			System.out.println(path + "目录不存在，需要创建！");
			// 创建目录
			file.mkdir();
		}

		try {
			// 使用Apache文件上传组件处理文件上传步骤：
			// 1.创建一个DiskFileItemFactory工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 2.创建一个文件上传解析器
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 解决中文乱码
			upload.setHeaderEncoding("UTF-8");
			// 3.判断提交的数据普通表单的数据还是带文件上传的表单
			if (!upload.isMultipartContent(request)) {
				// 如果是表单数据普通表单,则按照传统方式获取数据
				return;
			}
			// 4.使用ServletFileUpload解析器解析上传数据，解析结果返回的是一个List<FileItem>集合，每一个FileItem对应一个Form表单的输入项
			List<FileItem> list = upload.parseRequest(request);

			// 定义一个文章对象
			Article article = new Article();
			for (FileItem item : list) {
				// 如果fileItem中封装的是普通输入项的数据
				if (item.isFormField()) {
					// 获取字段名字
					String name = item.getFieldName();
					// 解决普通输入项中中文乱码问题
					String value = item.getString("UTF-8");

					System.out.println(name + " = " + value);

					//获取参数方式方式发生变化
					if ("title".equals(name)) {
						article.setTitle(value);
					}
					if ("author".equals(name)) {
						article.setAuthor(value);
						;
					}
					if ("categoryId".equals(name)) {
						article.setCategoryId(Integer.valueOf(value));
						;
					}
					if ("description".equals(name)) {
						article.setDescription(value);
					}
					if ("content".equals(name)) {
						article.setContent(value);
					}

				} else { // 如果表单中提交的是上传文件
					// 获得上传的文件名称
					String filename = item.getName();

					// 获取文件后缀名
					String suffix = filename.substring(filename.lastIndexOf("."), filename.length());

					if (filename == null || filename.trim().equals(" ")) {
						continue;
					}
					// 注意：不同的浏览器提交的文件名称是不一样的，有些浏览器提交的文件会带有路径，如“D:\\project\WebRoot\hello.jsp”，有一些是单纯的文件名：hello.jsp
					// 去掉获取到文件名中的路径名，保留单纯的文件名
					filename = filename.substring(filename.lastIndexOf("\\") + 1);
					filename = EncryptUtils.md5(filename + new Date().getTime()) + suffix;

					String coverImg = "uploads/cover/" + filename;
					article.setCoverImg(coverImg);

					// 获取item中的上传文件的输入流
					InputStream in = item.getInputStream();
					// 创建一个文件输入流
					FileOutputStream out = new FileOutputStream(path + "\\" + filename);
					// 创建一个缓冲区
					byte buffer[] = new byte[1024];
					// 判断输入流中的数据是否已经读取完毕的标志位
					int len = 0;
					// 循环将输入流读入到缓冲区当中，（len = in.read(buffer)>0）就表示in里面还有数据存在
					while ((len = in.read(buffer)) > 0) {
						// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录（path+"\\"+filename）当中
						out.write(buffer, 0, len);
					}
					// 关闭输入流
					in.close();
					// 关闭输出流
					out.close();
					// 删除处理文件上传生成的临时文件
					item.delete();

				}
			}

			// 插入数据库
			// 实例化 ArticleDAO
			ArticleDAO articleDAO = new ArticleDAO();
			articleDAO.add(article);

		} catch (Exception e) {
			e.printStackTrace();
		}

		response.sendRedirect("articleList.do");

	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getRequestDispatcher("/admin/articleAdd.jsp").forward(request, response);
	}

}